package Comparable_etc;

/**
 * @author Jimmy Zhan WORKSTATION
 * @date 2023/3/16 22:11
 * 说明：产品类，用于 “自定义类比较大小”问题
 */

public class Product implements Comparable{
    private String name;
    private double price;

    public Product() {
    }

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Product{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    /**
     * 当前的类需要实现Comparable类中的抽象方法compareTo(Object o)
     *
     * 在此方法中，指明如何判断当前类的对象大小
     * 比如价格排序
     *
     * return 正：当前对象大。 负：当前对象小。  0：一样大。
     */
//    @Override
//    public int compareTo(Object o) {
//        if (o == this){
//            return 0;
//        }
//
//        if (o instanceof Product){
//            // o传入以后，若判断是一个Product类型，就进行强制类型转换，用p保留
//            Product p = (Product) o;
//
//            return Double.compare(this.price, p.price);
//        }
//
//        // 手动抛出异常类的对象
//        throw new RuntimeException("类型不匹配");
//    }


    /**
     * 比较的方法升级：
     * 先比较价格，价格相等时，再比较名字
     */
    @Override
    public int compareTo(Object o) {
        if (o == this){
            return 0;
        }
        if (o instanceof Product){
            Product p = (Product) o;
            int res = Double.compare(this.price, p.price);
            if (res != 0){
                return res;
            }
            return this.name.compareTo(p.name);
        }

        throw new RuntimeException("类型不匹配");
    }
}
